package com.lh.common.utils;

import org.apache.commons.lang.StringUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * 数字计算工具类
 *
 */
public class MathUtil {

	private static final int DEF_DIV_SCALE = 10;

	public static final double POW_BASE = 10D;

	/**
	 * 判断是否是数字
	 *
	 * @param m
	 * @return
	 */
	public static boolean isNumber(String m) {
		if (StringUtils.isEmpty(m)) {
			return false;
		}
		return m.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
	}

	/**
	 * 数字转换,精确 到2位小数
	 *
	 * @param m
	 * @return
	 */
	public static String preciseDecimal(double m) {
		// DecimalFormat f = new DecimalFormat("###,###,##0.00");
		DecimalFormat f = new DecimalFormat("##0.00");
		return f.format(m);
	}

	/**
	 * 数字精确到2位小数后,出现 ' .1 '的情况下在前面补0
	 *
	 * @param s
	 *            待补零数字
	 * @return '#.##'
	 */
	@Deprecated
	public static String temporaryZero(String s) {

		if (Double.parseDouble(s) < 1) {
			int i = s.indexOf('.');
			if (i == 0) {
				s = '0' + s;
			}
		}

		return s;
	}

	/**
	 * 精确的加法运算
	 *
	 * @return
	 */
	public static BigDecimal add(BigDecimal b1, BigDecimal b2) {
		return b1.add(b2);
	}

	/**
	 * 减法运算
	 *
	 * @author zhengxg
	 * @return
	 */
	public static BigDecimal subtract(BigDecimal b1, BigDecimal b2) {
		return b1.subtract(b2);
	}

	/**
	 * 精确的乘法运算
	 *
	 * @return
	 */
	public static BigDecimal mul(BigDecimal b1, BigDecimal b2) {
		return b1.multiply(b2);
	}

	/**
	 * (相对精确) 除法运算，当发生除不尽的情况时，精确到 小数点以后10位，以后的数字四舍五入
	 *
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @return 两个参数的商
	 */
	public static double div(double v1, double v2) {
		return div(v1, v2, DEF_DIV_SCALE);
	}

	/**
	 *
	 * @Title: getPercentage
	 * @Description: 获取两个值的百分比 TODO(这里用一句话描述这个方法的作用)
	 * @param @param v1
	 * @param @param v2
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 */
	public static String getPercentage(Integer v1, Integer v2) {
		// 创建一个数值格式化对象

		NumberFormat numberFormat = NumberFormat.getInstance();

		// 设置精确到小数点后2位

		numberFormat.setMaximumFractionDigits(2);

		String result = numberFormat.format((float) v1 / (float) v2 * 100);

		return result+"%";
	}

	/**
	 * 除法运算。当发生除不尽的情况时，由scale参数指 定精度，以后的数字四舍五入。
	 *
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @param scale
	 *            表示表示需要精确到小数点以后几位。
	 * @return 两个参数的商
	 */
	public static double div(double v1, double v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("精确小数位不能小于0");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	public static BigDecimal div(BigDecimal b1, BigDecimal b2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("精确小数位不能小于0");
		}
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
	}

	/**
	 * @Title: div
	 * @Description: 分转换为元 精确到2位小数
	 * @param @param b1
	 * @param @return 设定文件
	 * @return BigDecimal 返回类型
	 * @author WeiZecheng
	 * @date 2017年9月6日 下午2:39:14
	 * @throws
	 */
	public static BigDecimal div(BigDecimal b1) {
		BigDecimal b2 = new BigDecimal(new Integer(100));
		return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
	}

	public static String generateValidationCode() {
		// 随机生成验证码
		int start = (int) ((Math.random() * 9 + 1) * 100000);
		return String.valueOf(start);
	}

	public static void main(String[] args) {
		BigDecimal test = new BigDecimal(new Integer(80));
		BigDecimal test1 = new BigDecimal(new Integer(100));
		System.out.println(div(test, test1, 2).toString());
		div(test, test1, 2);
	}
}
